Skip to main content

Deposit Transaction Lifecycle

1. Generate OAuth Access Token​

The script builds a JWT client assertion with kid, signs it with PRI_KEY, and exchanges it for an access token.

const jwt = await new SignJWT()
.setProtectedHeader({ alg: 'ES256', kid: PRI_KEY.kid })
.setIssuer(clientId)
.setSubject(clientId)
.setAudience(oktaUrl)
.setExpirationTime('5m')
.setJti(crypto.randomUUID())
.sign(jwkPriKey);

Use the returned access_token as Authorization: Bearer <token> in GraphQL requests.

2. Prepare Wallet + Signing Key​

Before deposit calls, the flow:

  • lists institution entities,
  • selects a network (network('STR')),
  • generates an Ed25519 key pair (generateEd25519Keys()),
  • creates a wallet via walletCreate with the public key.

The Ed25519 private key is used later to sign the approval intent payload.

3. Create Deposit​

Call depositCreate with walletId, productId, amount, wire reference, and user ID.

mutation depositCreate($walletId: ID!, $productId: ID!, $value: BigDecimal!, $fedWireRef: String!, $userId: String!) {
depositCreate(institutionInput: {
walletId: $walletId,
productId: $productId,
value: $value,
paymentMethodWire: { fedWireRefNumber: $fedWireRef },
buildSigningPackage: false,
userId: $userId
}) {
depositId
approvalsRequired
}
}

Save depositId from the response.

4. Approve Deposit​

Call depositApprove with buildSigningPackage: true to receive the signing payload.

mutation depositApprove($depositId: ID!, $userId: String!) {
depositApprove(institutionApproval: {
depositId: $depositId,
buildSigningPackage: true,
userId: $userId
}) {
intentSigningPackage { payloadType payload }
}
}

5. Sign Intent + Submit​

Sign intentSigningPackage.payload using the Ed25519 private key:

const intentSig = intentSignPayload(pubPriKey.priKey, payload);

Then finalize via depositSubmit:

mutation depositSubmit($depositId: ID!, $intentSig: String!) {
depositSubmit(institutionSubmit: { depositId: $depositId, intentSignature: $intentSig }) {
blockchainStatus
}
}

A successful submit returns a valid blockchainStatus and confirms the flow is complete.

Run Example​

cd pub/examples
npm install
npm run deposit-flow